package io.modifier.basic.compose.widget.weui.core.utils

import kotlinx.datetime.Instant
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import kotlin.math.pow
import kotlin.text.padStart
import kotlin.text.substring
import kotlin.text.toInt

fun Float.format(decimals: Int = 2): String {
    return if (rem(1) == 0f) {
        toInt().toString()
    } else {
        formatDecimal(this.toDouble(), decimals)
    }
}

fun Double.format(decimals: Int = 2): String {
    return if (rem(1) == 0.0) {
        toInt().toString()
    } else {
        formatDecimal(this, decimals)
    }
}

/**
 * 格式化度数
 *
 * @param degrees 度数
 */
fun formatDegree(degrees: Float, decimals: Int = 1): String {
    return "${degrees.format(decimals)}°"
}

/**
 * 格式化距离
 *
 * @param meters 米数
 */
fun formatDistance(meters: Int, decimals: Int = 1): String {
    return if (meters >= 1000) {
        "${(meters / 1000f).format(decimals)}km"
    } else {
        "${meters}m"
    }
}

/**
 * 将给定的双精度浮点数格式化为指定小数位数的字符串
 *
 * @param number 要格式化的数字
 * @param decimalPlaces 要保留的小数位数
 * @return 格式化后的字符串
 */
fun formatDecimal(number: Double, decimalPlaces: Int): String {
    // 将 number 转换为以毫秒为单位的 Instant 对象
    val instant = Instant.fromEpochMilliseconds((number * 1000).toLong())
    // 将 Instant 对象转换为当前系统默认时区的 LocalDateTime 对象
    val localDateTime = instant.toLocalDateTime(TimeZone.currentSystemDefault())
    // 获取纳秒部分的字符串表示，并在前面填充 0 直到总长度为 9
    var decimalPart = localDateTime.nanosecond.toString().padStart(9, '0').substring(0, decimalPlaces)
    if (decimalPart.isNotBlank()) decimalPart = ".$decimalPart"
    return "${number.toInt()}$decimalPart"
}

// 可能不适用于非常大的数字或非常高的精度
fun formatSimple(number: Double, decimalPlaces: Int): String {
    val integerPart = number.toInt()
    val decimalPart = ((number - integerPart) * (10.0.pow(decimalPlaces))).toInt()
    return "$integerPart.${decimalPart.toString().padStart(decimalPlaces, '0')}"
}